/**
 * @file file.c
 * @author lcz (you@domain.com)
 * @brief 
 * @version 0.1
 * @date 2022-11-06
 * 
 * @copyright Copyright (c) 2022
 * 
 */

#include "fs/file.h"
#include "ipc/mutex.h"
#include "tools/kilb.h"

static file_t file_table[FILE_TABLE_SIZE];
static mutex_t file_alloc_mutex;

/**
 * @brief 文件初始化
 */
void file_table_init(void){
    // 互斥锁一下可好
    mutex_init(&file_alloc_mutex);
    kernel_memset(file_table, 0, sizeof(file_table));
}
/**
 * @brief 分配一个空文件，返回文件指针
 */
file_t *file_alloc(void){
    file_t *file = (file_t *)0;
    mutex_lock(&file_alloc_mutex);
    // 寻找空闲单元
    for (int i = 0; i < FILE_TABLE_SIZE; i++)
    {
        file_t *p_file = file_table + i;
        // 文件引用次数为0及为空文件
        if (p_file->ref == 0)
        {
            // 清空文件
            kernel_memset(p_file, 0, sizeof(file_t));
            p_file->ref = 1;
            file = p_file;
            mutex_unlock(&file_alloc_mutex);
            return file;
        }
    }
    mutex_unlock(&file_alloc_mutex);
    return file;
}
/**
 * @brief 清空，释放指定file文件
 */
void file_free(file_t *file){
    mutex_lock(&file_alloc_mutex);
    // file->ref=0;
    if (file->ref)
    {
        file->ref--;
    }
    mutex_unlock(&file_alloc_mutex);
}
/**
 * @brief 增加file的引用计数
 */
void file_inc_ref(file_t *file)
{
    //锁保护
    mutex_lock(&file_alloc_mutex);
    file->ref++;
    mutex_unlock(&file_alloc_mutex);
}
